/**
 * <p>Copyright:Copyright(c) 2019</p>
 * <p>Company:Professional</p>
 * <p>Package:org.cesgroup.course.cor</p>
 * <p>File:InterceptorChain.java</p>
 * <p>类更新历史信息</p>
 * @todo chanlong(陈龙) 创建于 Sep 12, 2019 12:19:20 PM
 */
package org.cesgroup.course.interceptor;

import java.util.ArrayList;
import java.util.List;

import org.springframework.core.annotation.Order;

import cn.hutool.core.annotation.AnnotationUtil;
import cn.hutool.core.collection.CollectionUtil;

/**
 * <p>描述: </p>
 * <p>Company: Professional</p>
 * @author chanlong(陈龙)
 * @date Sep 12, 2019 12:19:20 PM
 * @version 1.0.2019
 */
// 代理对象责任链，即责任链的启动类
public class ProxyChain<T> {

	private final List<Interceptor> interceptors = new ArrayList<>();

	// 加载、执行所有的代理并返回目标对象
	@SuppressWarnings("unchecked")
	public T all(T target) {
		// 根据Order注解，对代理对象进行排序
		interceptors.sort((a, b) -> {
			Order ao = AnnotationUtil.getAnnotation(a.getClass(), Order.class);
			Order bo = AnnotationUtil.getAnnotation(b.getClass(), Order.class);
			return null != ao && null != bo ? ao.value() - bo.value() : 0; 
		});
		// 排序倒置（在代理集合中执行责任链时，是倒序处理“参考递归原理，即最后被调用的方法最先执行，然后层层退出”）
		final List<Interceptor> reverse = CollectionUtil.reverse(interceptors);
		// 
		for (Interceptor interceptor : reverse) {
			// 此处的“apply”即“Chain.wrap”
			target = (T) interceptor.apply(target);
		}
		return target;
	}

	public void addInterceptor(Interceptor interceptor) {
		interceptors.add(interceptor);
	}
	
	public List<Interceptor> getInterceptors() {
		return interceptors;
	}
}
